// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.chat_guest.utils;

import android.app.Activity;
import android.content.Context;

import com.eva.android.widget.WidgetUtils;
import com.x52im.rbchat.Const;
import com.x52im.rbchat.R;
import com.x52im.rainbowchat.im.dto.MsgType;
import com.x52im.rbchat.logic.chat_root.model.Message;
import com.x52im.rbchat.logic.chat_root.model.ContactMeta;
import com.x52im.rbchat.logic.chat_root.model.FileMeta;
import com.x52im.rbchat.logic.chat_root.model.LocationMeta;
import com.x52im.rbchat.logic.chat_root.sendfile.SendFileProcessor;
import com.x52im.rbchat.logic.chat_root.sendimg.PreviewAndSendActivity;
import com.x52im.rbchat.logic.chat_root.sendshortvideo.SendShortVideoProcessor;
import com.x52im.rbchat.logic.chat_root.sendvoice.SendVoiceProcessor;

import java.util.Observer;

/**
 * 消息重发实用工具类（用于一对一陌生人聊天时）。
 */
public class TMessageReSendHelper
{
    /**
     * 消息重发统一接口。
     *
     * @param activity
     * @param cme
     * @param to
     */
    public static void reSend(Activity activity, Message cme, String toUid, String toNickname) {
        reSend(activity, false, cme, toUid, toNickname, null);
    }

    /**
     * 消息重发统一接口。
     * <p>
     * 注：目前为了重用代码，消息转发功能重用了消息重发功能的代码逻辑，日后如消息重发功能逻辑需独立演进，再考虑单
     * 独维护消息重发功能的代码不迟！
     *
     * @param activity
     * @param forForward true表示用于消息转发功能，否则不是
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    public static void reSend(Activity activity, boolean forForward, Message cme, String toUid, String toNickname, Observer sucessObsExtra)
    {
        // 转发的消息可以是收到的也可以是发出的，而重发的消息只针对发出的消息
        if(cme != null && (forForward || cme.isOutgoing()))
        {
            switch (cme.getMsgType())
            {
                case MsgType.TYPE_TEXT:
                    TMessageReSendHelper.reSendTextMessage(activity, toUid, toNickname, cme.getText(), sucessObsExtra);
                    break;
                case MsgType.TYPE_IMAGE:
                    TMessageReSendHelper.reSendImageMessage(activity, forForward, toUid, toNickname, cme.getText(), sucessObsExtra);
                    break;
                case MsgType.TYPE_VOICE:
                    TMessageReSendHelper.reSendVoiceMessage(activity, forForward, toUid, toNickname, cme.getText(), sucessObsExtra);
                    break;
                case MsgType.TYPE_FILE: {
                    FileMeta fm = (FileMeta) cme.getTextObject();
                    TMessageReSendHelper.reSendFileMessage(activity, forForward, toUid, toNickname, fm.getFilePath(), fm.getFileMd5(), fm.getFileLength(), sucessObsExtra);
                    break;
                }
                case MsgType.TYPE_SHORTVIDEO: {
                    FileMeta fm = (FileMeta) cme.getTextObject();
                    TMessageReSendHelper.reSendShortVideoMessage(activity, forForward, toUid, toNickname, fm.getFilePath(), fm.getFileMd5(), sucessObsExtra);
                    break;
                }
                case MsgType.TYPE_CONTACT: {
                    ContactMeta cm = (ContactMeta) cme.getTextObject();
                    TMessageReSendHelper.reSendContactMessage(activity, toUid, toNickname, cm, sucessObsExtra);
                    break;
                }
                case MsgType.TYPE_LOCATION: {
                    LocationMeta lm = (LocationMeta) cme.getTextObject();
                    TMessageReSendHelper.reSendLocationMessage(activity, toUid, toNickname, lm, sucessObsExtra);
                    break;
                }
                default:
                    WidgetUtils.showWithDialog(activity
                            , activity.getResources().getString(R.string.general_prompt)
                            , "暂时不支持"+(forForward ? "转发":"重发")+"类型为"+cme.getMsgType()+"的消息！");
                    break;
            }
        }
        else
        {
            WidgetUtils.showWithDialog(activity
                    , activity.getResources().getString(R.string.general_prompt), "数据不完整，无法进行消息"+(forForward ? "转发":"重发")+"！");
        }
    }

    /**
     * 重发文本消息。
     *
     * @param context Context
     * @param toUid 消息接收者
     * @param message 消息内容
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendTextMessage(Activity context, String toUid, String toNickname, String message, Observer sucessObsExtra)
    {
        TMessageHelper.sendPlainTextMessageAsync(context, toUid, toNickname, message, sucessObsExtra);
    }

    /**
     * 重发图片消息。
     *
     * @param context Context
     * @param to 消息接收者
     * @param imageFileName 图片文件名
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendImageMessage(Context context, boolean forForward, String to, String toName, String imageFileName, Observer sucessObsExtra)
    {
        PreviewAndSendActivity.doSendLogic(context, forForward, to, toName, Const.CHAT_TYPE_GUEST$CHAT, imageFileName, sucessObsExtra);
    }

    /**
     * 重发语音留言消息。
     *
     * @param context Context
     * @param to 消息接收者
     * @param voiceFileName 语音留言音视频文件名
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendVoiceMessage(Context context, boolean forForward, String to, String toName, String voiceFileName, Observer sucessObsExtra)
    {
        SendVoiceProcessor.doSendLogic(context, forForward, to, toName, Const.CHAT_TYPE_GUEST$CHAT, voiceFileName, sucessObsExtra);
    }

    /**
     * 重发大文件消息。
     *
     * @param context Context
     * @param toUid 接者者uid
     * @param filePath 文件完整路径
     * @param fileMD5 文件md5码
     * @param fileLenForForward 文件大小（单位：字节），此字段目前仅用于消息转发时（其它情况请传0），因为转发收到的文件
     *                           消息时，因此时文件可能尚未下载，如果直接通过从本地文件信息中读大小那就不可能了
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendFileMessage(Context context, boolean forForward, String toUid, String toName, String filePath, String fileMD5, long fileLenForForward, Observer sucessObsExtra)
    {
        SendFileProcessor.doSendLogic(context, forForward, toUid, toName, Const.CHAT_TYPE_GUEST$CHAT, filePath, fileMD5, fileLenForForward, sucessObsExtra);
    }

    /**
     * 重发短视频消息。
     *
     * @param context Context
     * @param toUid 接者者uid
     * @param filePath 文件完整路径
     * @param fileMD5 文件md5码
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendShortVideoMessage(Context context, boolean forForward, String toUid, String toName, String filePath, String fileMD5, Observer sucessObsExtra)
    {
        SendShortVideoProcessor.doSendLogic(context, forForward, toUid, toName, Const.CHAT_TYPE_GUEST$CHAT, filePath, fileMD5, sucessObsExtra);
    }

    /**
     * 重发"个人名片"消息。
     *
     * @param context Context
     * @param toUid 消息接收者
     * @param meta 消息内容
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendContactMessage(Activity context, String toUid, String toName, ContactMeta meta, Observer sucessObsExtra)
    {
        TMessageHelper.sendContactMessageAsync(context, toUid, toName, meta, sucessObsExtra);
    }

    /**
     * 重发"位置"消息。
     *
     * @param context Context
     * @param toUid 消息接收者
     * @param meta 消息内容
     * @param sucessObsExtra 消息发送完成后，额外要做的事
     */
    private static void reSendLocationMessage(Activity context, String toUid, String toName, LocationMeta meta, Observer sucessObsExtra)
    {
        TMessageHelper.sendLocationMessageAsync(context, toUid, toName, meta, sucessObsExtra);
    }
}
